package a17_Reflection.Test.Constructor;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @Author quan
 * @Description 反射获取构造方法
 * @Date 2023/5/1 15:45
 */
public class MyReflect1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //1、获取class字节码文件对象
        Class cls1 = Class.forName("a17_Reflection.Test.Constructor.Student1");
        //2、获取构造方法
        //(1)获取所有公共的构造方法
        Constructor[] cons1 = cls1.getConstructors();
        for (Constructor con:cons1) {
            System.out.println(con);
        }
        //(2)获取所有的构造方法：包括私有的
        Constructor[] cons2 = cls1.getDeclaredConstructors();
        for (Constructor con:cons2) {
            System.out.println(con);
        }
        //(3)获取单个的
        //空参构造的
        Constructor con3 = cls1.getDeclaredConstructor();
        System.out.println(con3);
        //获取一个参数：String name的有参构造
        Constructor con4 = cls1.getDeclaredConstructor(String.class);
        System.out.println(con4);
        //获取一个参数： int age protected修饰的
        Constructor con5 = cls1.getDeclaredConstructor(int.class);
        System.out.println(con5);
        //获取两个参数： int age与String name
        Constructor con6 = cls1.getDeclaredConstructor(String.class,int.class);
        System.out.println(con6);

        //暴力反射：表示临时取消权限校验
        con6.setAccessible(true);//不加就报错，因为两个参数的有参构造是私有的
        Student1 stu = (Student1) con6.newInstance("张三",18);
        System.out.println(stu);

    }
}
